﻿// (c) Comkarl Calipso
// By Matías Fidemraizer (http://www.matiasfidemraizer.com)
// -------------------------------------------------
// http://calipso.codeplex.com
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

using System;
using System.Collections.Generic;
using System.IO;
using System.Web;
using System.Web.UI;

namespace Comkarl.Web.UI
{
    /// <summary>
    /// Represents the base class for any page.
    /// </summary>
    public abstract class Page : System.Web.UI.Page
    {
        /// <summary>
        /// Recursively gets a set of controls by type.
        /// </summary>
        /// <typeparam name="TControl">
        /// The type of controls to find.
        /// </typeparam>
        /// <param name="parent">
        /// Optionally gives the parent control from which the search should start.
        /// </param>
        /// <returns></returns>
        public IEnumerable<TControl> FindControlsRecursive<TControl>(Control parent = null)
            where TControl : Control
        {
            List<TControl> result = new List<TControl>();

            foreach (Control control in parent != null ? parent.Controls : Controls)
            {
                if (control.GetType() == typeof(TControl))
                {
                    result.Add((TControl)control);
                }
                else if (control.HasControls())
                {
                    result.AddRange(FindControlsRecursive<TControl>(control));
                }
            }

            return result;
        }

        protected override void OnPreInit(EventArgs e)
        {
            base.OnPreInit(e);

            if (CssManager.ThemingEnabled)
            {
                if (Master != null)
                {
                    string themeMasterPage = VirtualPathUtility.Combine(CssManager.GetThemeVirtualPath(CssManager.CurrentThemeId), MasterPageFile.TrimStart('/'));

                    if (File.Exists(Context.Server.MapPath("~/" + themeMasterPage)))
                    {
                        MasterPageFile = VirtualPathUtility.Combine(CssManager.GetThemeVirtualPath(CssManager.CurrentThemeId), MasterPageFile.TrimStart('/'));
                    }
                }
            }
        }
    }
}